#include "IO_Ctrl_hw.h"
#include "globalDef.h"

void init_IOCtrl_hw(void)
{
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOB);
	//rcu_periph_clock_enable(RCU_GPIOC);
	
	//rcu_periph_clock_enable(RCU_AF);
	//gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);
	//AD1-A4   AD2-A5   AD3-A6   AD4-A7   AD5-A1   AD6-B1  AD7-L610ADC0 AD8-L610ADC2
	gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_1 | GPIO_PIN_4 |GPIO_PIN_7);
	gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_5);
	
	gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_0 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11);
	//gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
	//gpio_bit_write(GPIOC, GPIO_PIN_15, (bit_status)(0));
	gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_14);
	
	writeIOLow(0x0B, 10);
	writeIOLow(0x0B, 11);
	
#if ( OBU_POWER_CONTRL_DEF == 1 )/*初始化OBU电源控制口*/
	gpio_init(GPIOB, GPIO_MODE_OUT_OD, GPIO_OSPEED_2MHZ, GPIO_PIN_3);
	writeIOLow(0x0B, 3);		/*默认打开外部供电3.3V/5.0V*/
#endif
}


//输入参数这样规定，比如让PA5输出高，0x0A, 0x05
//比如让PB12输出高，0x0B, 0x0C
void writeIOHigh(uint32_t gpio_port, uint32_t pin)
{
	uint32_t gpio_periph;
	
	switch(gpio_port)
	{
		case 0x0A:
			gpio_periph = GPIOA;
			break;
		
			case 0x0B:
			gpio_periph = GPIOB;
			break;
			
			case 0x0C:
			gpio_periph = GPIOC;
			break;
			
			default:
				return;
	}
	
	gpio_bit_set(gpio_periph, BIT(pin));
	
}


//输入参数这样规定，比如让PA5输出低，0x0A, 0x05
//比如让PB12输出低，0x0B, 0x0C
void writeIOLow(uint32_t gpio_port, uint32_t pin)
{
	uint32_t gpio_periph;
	
	switch(gpio_port)
	{
		case 0x0A:
			gpio_periph = GPIOA;
			break;
		
			case 0x0B:
			gpio_periph = GPIOB;
			break;
			
			case 0x0C:
			gpio_periph = GPIOC;
			break;
			
			default:
				return;
	}
	
	gpio_bit_reset(gpio_periph, BIT(pin));
}
/*high:1,low:0*/
uint32_t readIOsta(uint32_t gpio_port, uint32_t pin)
{
	uint32_t gpio_periph;
	
	switch(gpio_port)
	{
		case 0x0A:
			gpio_periph = GPIOA;
			break;
		
			case 0x0B:
			gpio_periph = GPIOB;
			break;
			
			case 0x0C:
			gpio_periph = GPIOC;
			break;
			
	}
	
	if(0x00 != gpio_input_bit_get(gpio_periph, BIT(pin)))
	{
		return 1;
	}
	else
	{
		return 0;
	}
		
}


//至少初始化一次
static u8 initRelayOnce = 0;

void relayPowerOn_hw(void)
{

	if (initRelayOnce == 0)
	{
		initRelayOnce = 1;
		
		rcu_periph_clock_enable(RCU_GPIOB);
		//增加继电器控制
		gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_13);
	}

	gpio_bit_reset(GPIOB,GPIO_PIN_13);
#if CONFIG_TWO_RELAY
	EngineStart_PowerOn();
#endif
}


void relayPowerOff_hw(void)
{

	if (initRelayOnce == 0)
	{
		initRelayOnce = 1;
		
		rcu_periph_clock_enable(RCU_GPIOB);
		//增加继电器控制
		gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_13);
	}
	
	gpio_bit_set(GPIOB,GPIO_PIN_13);
#if CONFIG_TWO_RELAY
	EngineStart_PowerOff();
#endif
}

/*
输出高电平，点火
点火时间，暂定只要客户按着按钮，则一直点火
*/
void EngineStart_PowerOn(void)
{
	gpio_bit_set(GPIOB,GPIO_PIN_14);
}
/*
输出低电平，点火后要保持在低电平
*/
void EngineStart_PowerOff(void)
{
	gpio_bit_reset(GPIOB,GPIO_PIN_14);
}


FlagStatus relayPowerOff_hw_sta(void)
{
	return gpio_output_bit_get(GPIOB,GPIO_PIN_13);
}

FlagStatus EngineStart_PowerOff_sta(void)
{
	return gpio_output_bit_get(GPIOB,GPIO_PIN_14);
}


